package net.jqsoft.common.support;

import java.io.Serializable;
/**
 * <p>
 * 持久化服务接口
 * </p>
 * <p>
 * 增、 删 、改  为可抽象的方法
 * </p>
 * 
 * @author wangjie
 *
 * @param <T> 实体泛型
 */
public interface RepositoryService<T> {

	/**
	 * <p>
	 * 保存  根据主键是否为空判断进行插入逻辑或者更新逻辑
	 * </p>
	 *
	 * @param entity 实体对象
	 * @return boolean 插入是否成功
	 */
	boolean save(T entity);
	
	/**
	 * <p>
	 * 插入
	 * </p>
	 *
	 * @param entity 实体对象
	 * @return boolean 插入是否成功
	 */
	boolean insert(T entity);

	/**
	 * <p>
	 * 批量插入
	 * </p>
	 *
	 * @param entities  实体对象列表
	 * @return boolean 批量插入是否成功
	 */
	boolean insert(Iterable<T> entities);

	/**
	 * <p>
	 * 修改
	 * </p>
	 *
	 * @param entity 实体对象
	 * @return boolean 修改是否成功
	 */
	boolean update(T entity);

	/**
	 * <p>
	 * 批量更新
	 * </p>
	 *
	 * @param entities 实体对象列表
	 * @return boolean 批量修改是否成功
	 */
	boolean update(Iterable<T> entities);

	/**
	 * <p>
	 * 根据主键查找实体
	 * </p>
	 *
	 * @param id 主键
	 * @return T 实体
	 */
	T findOne(Serializable id);

	/**
	 * <p>
	 * 根据主键判断实体是否存在
	 * </p>
	 *
	 * @param id  主键
	 * @return boolean 实体是否存在
	 */
	boolean exists(Serializable id);
	
	/**
	 * <p>
	 * 根据ID删除实体
	 * </p>
	 *
	 * @param id 主键
	 * @return boolean 删除是否成功
	 */
	boolean deleteById(Serializable id);

	/**
	 * <p>
	 * 根据主键列表批量删除
	 * </p>
	 *
	 * @param ids 主键列表
	 * @return boolean 删除是否成功
	 */
	boolean delete(Iterable<Serializable> ids);
	
	/**
	 * <p>
	 * 根据主键逗号分割字符串 批量删除
	 * </p>
	 *
	 * @param ids 主键逗号分割字符串
	 * @return boolean 删除是否成功
	 */
	boolean deleteBatchIds(String ids);
}